from django.shortcuts import render
from django.views import View
from django.http import JsonResponse
from alipay import AliPay
from django.conf import settings
from apps.orders.models import OrderInfo
from apps.payments.models import Payment


# Create your views here.
class PayMentView(View):
    """
        构造支付宝的跳转链接
    """

    def get(self, requset, order_id):

        # 获取订单信息
        try:
            order = OrderInfo.objects.get(order_id=order_id, status=1)
        except:
            return JsonResponse({
                'code': 400,
                'errmsg': '订单不存在',
            }, status=400)

        # 1、初始化生成支付对象
        alipay = AliPay(
            appid="2016091300505120",
            app_notify_url=settings.ALIPAY_RETURN_URL,  # 默认回调url
            app_private_key_path='/Users/august/Desktop/meiduo_project/meiduo_mall/apps/payments/keys/app_private_key.pem',
            # 指定美多私钥
            # 支付宝的公钥，验证支付宝回传消息使用，不是你自己的公钥,
            alipay_public_key_path='/Users/august/Desktop/meiduo_project/meiduo_mall/apps/payments/keys/app_public_key.pem',
            sign_type="RSA2",  # RSA 或者 RSA2
            debug=True  # 默认False
        )
        # 2、调用对象方法生成跳转链接 api_alipay_trade_page_pay这个方法只是生成了跳转链接所需要的查询字符串数据，需要和支付网关进行拼接
        order_string = alipay.api_alipay_trade_page_pay(
            out_trade_no=str(order_id),  # 点单编号
            total_amount=str(order.total_amount),  # 订单总价
            subject='美多商城',  # 看到的商家名称
            return_url=settings.ALIPAY_RETURN_URL,  # 跳转链接
        )
        # 拼接完整的支付地址
        alipay_url = 'https://openapi.alipaydev.com/gateway.do?' + order_string
        return JsonResponse({
            'code': 1,  # 前端接受的数据是1
            'errmsg': 'ok',
            'alipay_url': alipay_url
        })


class PayMentStatusView(View):
    """
    保存支付结果
    """

    def put(self, request):
        # 1、获取前端传递的数据内容 将查询字符串数据转化为字典
        data = request.GET.dict()
        # 2、验证数据，sign签名验证,使用三方模块进行验证
        signature = data.pop("sign")

        # 2-1 验证签名的有效性
        alipay = AliPay(
            appid="2016091300505120",
            app_notify_url=settings.ALIPAY_RETURN_URL,  # 默认回调url
            app_private_key_path='/Users/august/Desktop/meiduo_project/meiduo_mall/apps/payments/keys/app_private_key.pem',
            # 指定美多私钥
            # 支付宝的公钥，验证支付宝回传消息使用，不是你自己的公钥,
            alipay_public_key_path='/Users/august/Desktop/meiduo_project/meiduo_mall/apps/payments/keys/app_public_key.pem',
            sign_type="RSA2",  # RSA 或者 RSA2
            debug=True  # 默认False
        )
        # 是有效数据，success为true
        success = alipay.verify(data, signature)
        # 注意：周日支付宝沙箱维护会显示验证为false，所以在这里写not success
        if not success:
            # 3、数据的保存
            # 获取订单id
            order_id = data.get('out_trade_no')
            trade_id = data.get('trade_no')
            Payment.objects.create(order_id=order_id, trade_id=trade_id)
            # 更新订单状态 完成支付后状态改为待发货
            OrderInfo.objects.filter(order_id=order_id).update(status=2)
            # 4、返回结果
            return JsonResponse({
                'code': 0,
                'errmsg': 'ok',
                'trade_id': trade_id
            })
        else:
            return JsonResponse({
                'code': 400,
                'errmsg': '验证失败'
            }, status=400)
